package com.example.libpro.DAO;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.libpro.DBEntity.DBHelper;
import com.example.libpro.DBEntity.DataBaseContext;
import com.example.libpro.DBEntity.UserEntity;

import java.util.ArrayList;
import java.util.List;

/**
 * 图书管理系统读者数据访问类（DAO）
 * 作用：1. 封装"user"表（读者/管理员）的所有CRUD操作，直接对接DBHelper的数据库实例；
 * 2. 实现《安卓设计报告.docx》中"管理用户业务流程"（新增/编辑/删除/查询读者）与"登录功能"（账号密码校验）的底层数据操作；
 * 3. 为服务层（ReaderService、LoginService）提供读者数据访问接口，屏蔽数据库操作细节。
 * 关联实体：UserEntity（映射"user"表）
 * 依赖：DBHelper（获取SQLite数据库实例）、Android Context（初始化DBHelper）
 * 业务适配：支持逻辑删除（报告"管理用户业务流程"要求的"后台逻辑删除"）、关键字查询（报告要求的"输入学号或姓名关键字查询"）
 */
public class ReaderDAO {
    private final DBHelper dbHelper; // 数据库助手类实例（获取数据库连接）

    // 构造方法：初始化DBHelper
    /**
     * ReaderDAO构造方法
     * @param context Android上下文对象（如Activity、Application），用于创建DBHelper实例
     * 功能：初始化DBHelper，建立与SQLite数据库的连接通道，为后续CRUD操作提供基础
     */
    public ReaderDAO(Context context) {
        DataBaseContext dbContext = new DataBaseContext(context);
        this.dbHelper = new DBHelper(dbContext);
    }

    // 1. 新增读者（对应报告"管理用户业务流程-新增"）
    /**
     * 新增读者账号（插入"user"表）
     * @param userEntity 读者数据实体（含账号、密码、姓名、角色编号，roleId固定为2=读者）
     * @return boolean 操作结果：true=新增成功，false=新增失败（如账号重复）
     * 业务适配：符合报告"输入姓名/初始密码→提交→后台写入SQLite用户表"流程；
     * 注意事项：1. 账号（account）需唯一，若重复则返回false；2. 角色编号（roleId）需设为2（读者），管理员账号需通过其他接口创建
     */
    public boolean insertReader(UserEntity userEntity) {
        SQLiteDatabase db = null;
        try {
            db = dbHelper.getWritableDB(); // 获取可读写数据库实例
            ContentValues values = new ContentValues();
            // 封装UserEntity属性到ContentValues（与"user"表字段对应）
            values.put("account", userEntity.getAccount());
            values.put("password", userEntity.getPassword()); // 建议传入加密后的密码
            values.put("name", userEntity.getName());
            values.put("role_id", 2); // 固定为读者角色（报告中读者角色编号为2）
            values.put("is_deleted", 0); // 初始为未删除状态

            // 插入数据：返回新记录的行ID（-1表示插入失败）
            long rowId = db.insertWithOnConflict("user", null, values, SQLiteDatabase.CONFLICT_ABORT);
            return rowId != -1; // 行ID≠-1则新增成功
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (db != null && db.isOpen()) {
                db.close(); // 关闭数据库连接，避免资源泄漏
            }
        }
    }

    // 2. 修改读者信息（对应报告"管理用户业务流程-编辑"）
    /**
     * 修改读者信息（更新"user"表）
     * @param userEntity 读者数据实体（需含userId，其他属性为待修改值）
     * @return boolean 操作结果：true=修改成功，false=修改失败（如读者不存在）
     * 业务适配：符合报告"点击目标读者→修改姓名/密码/状态→提交更新"流程；
     * 支持修改项：姓名（name）、密码（password）、状态（is_deleted，0=正常，1=逻辑删除）
     */
    public boolean updateReader(UserEntity userEntity) {
        SQLiteDatabase db = null;
        try {
            db = dbHelper.getWritableDB();
            ContentValues values = new ContentValues();
            // 仅封装非null的属性（支持部分字段修改，如仅改密码）
            if (userEntity.getName() != null) values.put("name", userEntity.getName());
            if (userEntity.getPassword() != null) values.put("password", userEntity.getPassword());
            if (userEntity.getIsDeleted() != null) values.put("is_deleted", userEntity.getIsDeleted());

            // 条件：仅更新指定userId且未删除的记录（避免修改已删除读者）
            String whereClause = "user_id = ? AND is_deleted = 0";
            String[] whereArgs = {String.valueOf(userEntity.getUserId())};

            // 更新数据：返回受影响的行数（0表示无匹配记录，修改失败）
            int affectedRows = db.update("user", values, whereClause, whereArgs);
            return affectedRows > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (db != null && db.isOpen()) {
                db.close();
            }
        }
    }

    // 3. 逻辑删除读者（对应报告"管理用户业务流程-删除"）
    /**
     * 逻辑删除读者（更新"user"表的is_deleted字段为1，而非物理删除）
     * @param userId 读者ID（对应"user"表的user_id）
     * @return boolean 操作结果：true=删除成功，false=删除失败（如读者不存在）
     * 业务适配：符合报告"确认删除→后台逻辑删除"流程；
     * 优势：保留历史数据，避免误删后无法恢复，后续查询时过滤已删除记录
     */
    public boolean deleteReader(Integer userId) {
        SQLiteDatabase db = null;
        try {
            db = dbHelper.getWritableDB();
            ContentValues values = new ContentValues();
            values.put("is_deleted", 1); // 逻辑删除标识：1=已删除

            String whereClause = "user_id = ? AND is_deleted = 0";
            String[] whereArgs = {String.valueOf(userId)};

            int affectedRows = db.update("user", values, whereClause, whereArgs);
            return affectedRows > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (db != null && db.isOpen()) {
                db.close();
            }
        }
    }

    // 4. 关键字查询读者（对应报告"管理用户业务流程-查询"）
    /**
     * 按学号（账号）或姓名关键字查询读者（过滤已删除记录）
     * @param keyword 查询关键字（可输入账号、姓名的部分字符，支持模糊匹配）
     * @return List<UserEntity> 匹配的读者列表（无匹配时返回空列表）
     * 业务适配：符合报告"输入学号或姓名关键字→实时返回匹配列表"流程；
     * 查询逻辑：1. 匹配账号（account）包含关键字；2. 匹配姓名（name）包含关键字；3. 仅返回未删除（is_deleted=0）的读者
     */
    public List<UserEntity> queryReaderByKeyword(String keyword) {
        List<UserEntity> readerList = new ArrayList<>();
        SQLiteDatabase db = null;
        Cursor cursor = null; // 用于接收查询结果集
        try {
            db = dbHelper.getReadableDB(); // 获取只读数据库实例（查询操作无需写权限）
            // SQL查询：模糊匹配账号或姓名，过滤已删除记录
            String sql = "SELECT user_id, account, password, name, role_id, is_deleted " +
                    "FROM user " +
                    "WHERE is_deleted = 0 " +
                    "AND (account LIKE ? OR name LIKE ?)";
            // 模糊匹配参数（%表示任意字符，如"张"匹配"张三"、"张三丰"）
            String[] selectionArgs = {"%" + keyword + "%", "%" + keyword + "%"};

            cursor = db.rawQuery(sql, selectionArgs);
            // 遍历结果集，封装为UserEntity列表
            while (cursor.moveToNext()) {
                UserEntity user = new UserEntity();
                user.setUserId(cursor.getInt(cursor.getColumnIndexOrThrow("user_id")));
                user.setAccount(cursor.getString(cursor.getColumnIndexOrThrow("account")));
                user.setPassword(cursor.getString(cursor.getColumnIndexOrThrow("password")));
                user.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));
                user.setRoleId(cursor.getInt(cursor.getColumnIndexOrThrow("role_id")));
                user.setIsDeleted(cursor.getInt(cursor.getColumnIndexOrThrow("is_deleted")));
                readerList.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭游标和数据库连接（避免资源泄漏）
            if (cursor != null && !cursor.isClosed()) cursor.close();
            if (db != null && db.isOpen()) db.close();
        }
        return readerList;
    }

    // 5. 账号密码校验（对应报告"登录功能-后台查询SQLite用户表"）
    /**
     * 按账号和密码查询用户（用于登录校验）
     * @param account 登录账号
     * @param password 登录密码（需与数据库中存储的格式一致，如均为加密后的值）
     * @return UserEntity 匹配的用户实体（无匹配时返回null）
     * 业务适配：符合报告"后台查询SQLite用户表→账号密码匹配"流程；
     * 校验逻辑：1. 匹配账号（account）完全一致；2. 匹配密码（password）完全一致；3. 仅返回未删除（is_deleted=0）的用户
     */
    public UserEntity queryUserByAccountAndPwd(String account, String password) {
        SQLiteDatabase db = null;
        Cursor cursor = null;
        try {
            db = dbHelper.getReadableDB();
            String sql = "SELECT user_id, account, password, name, role_id, is_deleted " +
                    "FROM user " +
                    "WHERE account = ? " +
                    "AND password = ? " +
                    "AND is_deleted = 0";
            String[] selectionArgs = {account, password};

            cursor = db.rawQuery(sql, selectionArgs);
            if (cursor.moveToFirst()) { // 若有匹配记录，封装为UserEntity
                UserEntity user = new UserEntity();
                user.setUserId(cursor.getInt(cursor.getColumnIndexOrThrow("user_id")));
                user.setAccount(cursor.getString(cursor.getColumnIndexOrThrow("account")));
                user.setPassword(cursor.getString(cursor.getColumnIndexOrThrow("password")));
                user.setName(cursor.getString(cursor.getColumnIndexOrThrow("name")));
                user.setRoleId(cursor.getInt(cursor.getColumnIndexOrThrow("role_id")));
                user.setIsDeleted(cursor.getInt(cursor.getColumnIndexOrThrow("is_deleted")));
                return user;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null && !cursor.isClosed()) cursor.close();
            if (db != null && db.isOpen()) db.close();
        }
        return null; // 无匹配记录（账号或密码错误）
    }
}